#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <vector>
#include <functional>
#include "task.h"

using task_t = std::function<void()>;
void tasksLoad(std::vector<task_t>& tasks)
{
    tasks.push_back(Print);
    tasks.push_back(Lisening);
    tasks.push_back(backup);
}
int main()
{
    std::vector<task_t> tasks;
    tasksLoad(tasks);
    pid_t id = fork();
    if(id == 0)
    {
        while(true)
        {
            std::cout << "我是子进程，pid: " << getpid() << std::endl;
            sleep(1);
        }
    }
    while(true)
    {
        sleep(1);
        pid_t wid = waitpid(id,nullptr,WNOHANG);
        if(wid > 0)
        {
            std::cout << "等待子进程成功" << std::endl;
            break;
        }
        else if(wid < 0)
        {
            std::cout << "等待子进程失败" << std::endl;
            break;
        }
        else 
        {
            std::cout << "子进程尚未退出" << std::endl;
            //父进程做任务
            for(auto &task : tasks)
            {
                task();
            }
        }

    }
}










//std::vector<int> v;
//
//const char* sep = " ";
//int Savefile()
//{
//    srand(time(NULL));
//    std::string filename;
//    filename += std::to_string(rand());
//    filename += ".backup";
//    std::cout << filename << std::endl;
//    FILE* fp = fopen(filename.c_str(),"w");
//    if(fp == NULL)
//    {
//        perror("open fail");
//        return 1;
//    }
//    //创建文件成功
//    std::string data;
//    for(auto e: v)
//    {
//        data += std::to_string(e);
//        data += sep;
//    }
//    fputs(data.c_str(),fp);
//    return 0;
//}
//void Save()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int code = Savefile();
//        exit(code);
//    }
//    else
//    {
//        int status;
//        pid_t wid = waitpid(id,&status,0);
//        if(wid > 0)
//        {
//            int code = WEXITSTATUS(status);
//            std::cout << "等待子进程成功，子进程pid: " << id << std::endl;
//            if(wid > 0)
//            {
//                if(code == 0)
//                {
//                    std::cout << "备份成功,exit_code:" << code << std::endl;
//                }
//                else 
//                {
//                    std::cout << "备份失败,exit_code:" << code << std::endl;
//                }
//
//
//            }
//        }
//    }
//}
//
//int main()
//{
//    int cnt = 0;
//    while(1)
//    {
//        v.push_back(cnt);
//        cnt++;
//        if(cnt % 5 == 0)
//        {
//            Save();//子进程保存文件
//        }
//        sleep(1);
//    }
//    return 0;
//}
